#include "epoll.h"
//Epoller的构造函数，由epoll_create函数初始化了epollFd_，并且初始化了events_ vector
Epoller::Epoller(int maxEvent):epollFd_(epoll_create(512)),events_(maxEvent > 0? maxEvent: 1024)
{
    //断言，检查epollFd_是否创建成功（>=0）并且vector的events_是否初始化成功
    assert(epollFd_ >= 0 && events_.size() > 0);
}
//Epoller类的析构函数
Epoller::~Epoller()
{
    //析构函数，直接关闭epollFd_即可
    close(epollFd_);
}
//Epoller类的增加Fd的函数，参数要增加的fd，以及对应的事件
bool Epoller::AddFd(int fd,uint32_t events)
{
    //如果参数的fd小于0，失败，返回false
    if(fd < 0) return false;
    //创建了一个epoll_event结构体的变量，并初始化为0
    epoll_event ev = {0};
    //向ev.data.fd写入fd
    ev.data.fd = fd;
    //向ev.events写入events
    ev.events = events;
    //返回是否添加fd成功（和0比较，成功就是0）
    return 0 == epoll_ctl(epollFd_,EPOLL_CTL_ADD,fd,&ev);
}
//Epoller类的Wait函数，参数是要等待的时延
int Epoller::Wait(int timeoutMs)
{
    //返回epoll_wait的返回值（触发事件的fd的个数）
    return epoll_wait(epollFd_,&events_[0],static_cast<int>(events_.size()),timeoutMs);
}
//Epoller类的得到一个Fd的函数
int Epoller::GetEventFd(size_t i) const
{
    //断言判断当前的i是否合法
    assert(i < events_.size() && i >= 0);
    //返回当前指定的事件的fd
    return events_[i].data.fd;
}
//Epoller类的得到某一事件的函数
uint32_t Epoller::GetEvents(size_t i) const
{
    //断言当前i的值是否合法
    assert(i < events_.size() && i >= 0);
    //返回指定的i的事件
    return events_[i].events;
}
bool Epoller::ModFd(int fd, uint32_t events) {
    if(fd < 0) return false;
    epoll_event ev = {0};
    ev.data.fd = fd;
    ev.events = events;
    return 0 == epoll_ctl(epollFd_, EPOLL_CTL_MOD, fd, &ev);
}

bool Epoller::DelFd(int fd) {
    if(fd < 0) return false;
    epoll_event ev = {0};
    return 0 == epoll_ctl(epollFd_, EPOLL_CTL_DEL, fd, &ev);
}